package com.bbs.common.web;

import com.bbs.common.exception.CommonException;
import com.bbs.common.vo.DataResult;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @RestControllerAdvice 注解是 @ControllerAdvice 和 @ResponseBody 注解的组合
 * 它的作用是将所有的异常处理结果都以JSON格式返回给客户端。
 * 不写（）就默认所有的Controller
 */

@RestControllerAdvice
@Log4j2
public class GlobalExceptionController {

    // 自定义异常
    @ExceptionHandler(CommonException.class)
    public DataResult noStackException(CommonException exception) {
        // 在日志记录库（如 SLF4J、Log4j、Logback 等）中，{} 是一种占位符，它允许你在日志消息中动态插入变量的值。
        log.error("commonException, msg:{}", exception.getMessage());
        return DataResult.fail(exception.getMessage());
    }

    // 参数校验异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public DataResult noStackException(MethodArgumentNotValidException exception) {
        log.error("methodArgumentNotValidException, msg:{}", exception.getMessage());
        String msg = exception.getAllErrors().get(0).getDefaultMessage();
        return DataResult.fail(msg);
    }

    // 未知异常
    @ExceptionHandler(Exception.class)
    public DataResult noStackException(Exception exception) {
        log.error("exception, ", exception);
        return DataResult.fail("未知异常");
    }
}
